home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_2 / disasm.tar / disasm / append.c next >
C/C++ Source or Header  |  1990-04-25  |  3KB  |  226 lines

  1. #include "dis48.h"
  2.  
  3. char *
  4. #ifdef ANSI
  5. Append16(char *buf, int n)
  6. #else
  7. Append16(buf, n)
  8. char    *buf;
  9. int    n;
  10. #endif
  11. {
  12.     if (++n > 9) {
  13.         APPEND_CHAR(buf, '1');
  14.         n -= 10;
  15.     }
  16.     
  17.     APPEND_BDIGIT(buf, n);
  18.     TERMINATE(buf);
  19.     return(buf);
  20. }
  21.  
  22. char *
  23. #ifdef ANSI
  24. AppendAddr(char *buf, NAddr addr)
  25. #else
  26. AppendAddr(buf, addr)
  27. char    *buf;
  28. NAddr    addr;
  29. #endif
  30. {
  31.     int    mask, shift;
  32.     
  33.     APPEND_HEXMARK(buf);
  34.     for (mask = 0xf0000, shift = 16; mask != 0; mask >>= 4, shift -= 4)
  35.         APPEND_CHAR(buf, hex[(addr & mask) >> shift]);
  36.     
  37.     TERMINATE(buf);
  38.     return(buf);
  39. }
  40.  
  41. char *
  42. #ifdef ANSI
  43. AppendRAddr(char *buf, NAddr pc, int disp, int n, int offset)
  44. #else
  45. AppendRAddr(buf, pc, disp, n, offset)
  46. char    *buf;
  47. NAddr    pc;
  48. int    disp;
  49. int    n;
  50. int    offset;
  51. #endif
  52. {
  53.     int    sign;
  54.     
  55.     sign = 1 << (n * 4 - 1);
  56.     if (disp & sign)
  57.         disp |= ~(sign - 1);
  58.         
  59.     pc += disp;
  60.     target = pc;
  61.     buf = AppendStr(buf, "pc");
  62.     if (disp < 0) {
  63.         APPEND_CHAR(buf, '-');
  64.         disp = -disp - offset;
  65.     } else {
  66.         APPEND_CHAR(buf, '+');
  67.         disp += offset;
  68.     }
  69.         
  70.     buf = AppendAddr(buf, disp);
  71.     buf = AppendStr(buf, " (");
  72.     buf = AppendAddr(buf, pc);
  73.     APPEND_CHAR(buf, ')');
  74.     TERMINATE(buf);
  75.     return(buf);
  76. }
  77.  
  78. char *
  79. #ifdef ANSI
  80. AppendField(char *buf, Nybble fn)
  81. #else
  82. AppendField(buf, fn)
  83. char    *buf;
  84. Nybble    fn;
  85. #endif
  86. {
  87.     while (*buf != '\0')
  88.         buf++;
  89.         
  90.     APPEND_CHAR(buf, '.');
  91.     switch (fn) {
  92.     case 1: APPEND_CHAR(buf, 'x'); /* fall through */
  93.     case 0: APPEND_CHAR(buf, 'p'); break;
  94.     case 2:
  95.     case 3:
  96.         APPEND_CHAR(buf, 'x');
  97.         if (fn == 3)
  98.             break;
  99.             
  100.         /* fall through */
  101.     case 4: APPEND_CHAR(buf, 's'); break;
  102.     case 5: APPEND_CHAR(buf, 'm'); break;
  103.     case 6: APPEND_CHAR(buf, 'b'); break;
  104.     case 7: APPEND_CHAR(buf, 'w'); break;
  105.     case 0xf: APPEND_CHAR(buf, 'a'); break;
  106.     default: APPEND_CHAR(buf, '?'); break;
  107.     }
  108.     
  109.     APPEND_TAB(buf);
  110.     TERMINATE(buf);
  111.     return(buf);
  112. }
  113.  
  114. char *
  115. #ifdef ANSI
  116. AppendHexNyb(char *buf, char *mem, NAddr *addr, int n)
  117. #else
  118. AppendHexNyb(buf, mem, addr, n)
  119. char    *buf;
  120. char    *mem;
  121. NAddr    *addr;
  122. int    n;
  123. #endif
  124. {
  125.     int    i;
  126.     Nybble    t[16];
  127.     
  128.     APPEND_HEXMARK(buf);
  129.     for (i = 0; i < n; i++)
  130.         t[i] = GetNybble(mem, (*addr)++);
  131.     
  132.     while (--i >= 0)
  133.         APPEND_CHAR(buf, hex[t[i]]);
  134.  
  135.     TERMINATE(buf);
  136.     return(buf);
  137. }
  138.  
  139. char *
  140. #ifdef ANSI
  141. AppendDecInt(char *buf, int n)
  142. #else
  143. AppendDecInt(buf, n)
  144. char    *buf;
  145. int    n;
  146. #endif
  147. {
  148.     int    i;
  149.     char    b[9];
  150.     
  151.     if (n < 0) {
  152.         APPEND_CHAR(buf, '-');
  153.         n = -n;
  154.     }
  155.     
  156.     for (i = 0; n != 0; i++, n /= 10)
  157.         b[i] = n % 10 + '0';
  158.     
  159.     while (--i >= 0)
  160.         APPEND_CHAR(buf, b[i]);
  161.  
  162.     TERMINATE(buf);
  163.     return(buf);
  164. }
  165.  
  166. char *
  167. #ifdef ANSI
  168. AppendImmNyb(char *buf, char *mem, NAddr *addr, int n)
  169. #else
  170. AppendImmNyb(buf, mem, addr, n)
  171. char    *buf;
  172. char    *mem;
  173. NAddr    *addr;
  174. int    n;
  175. #endif
  176. {
  177.     APPEND_IMMMARK(buf);
  178.     return(AppendHexNyb(buf, mem, addr, n));
  179. }
  180.  
  181. #define NSTBIT    4
  182. char    *StBitStr[NSTBIT] = {"xm", "sb", "sr", "mp"};
  183.  
  184. char *
  185. #ifdef ANSI
  186. AppendStBits(char *buf, int n)
  187. #else
  188. AppendStBits(buf, n)
  189. char    *buf;
  190. int    n;
  191. #endif
  192. {
  193.     int    i;
  194.     char    *p, *q;
  195.     
  196.     for (p = buf, i = 0; i < NSTBIT; i++)
  197.         if (n & (1 << i)) {
  198.             if (p != buf) {
  199.                 APPEND_COMMA(p);
  200.             }
  201.             
  202.             /* p = AppendStr(p, StBitStr[i]); */
  203.             q = StBitStr[i];
  204.             while (*p = *q++)
  205.                 p++;
  206.         }
  207.     
  208.     TERMINATE(p);
  209.     return(p);
  210. }
  211.  
  212. char *
  213. #ifdef ANSI
  214. AppendStr(char *buf, char *str)
  215. #else
  216. AppendStr(buf, str)
  217. char    *buf;
  218. char    *str;
  219. #endif
  220. {
  221.     while (*buf = *str++)
  222.         buf++;
  223.     
  224.     return(buf);
  225. }
  226.